package com.dragon.common.enums;

import com.dragon.common.utils.DesensitizedUtils;

import java.util.function.Function;

/**
 * 脱敏类型枚举
 *
 * @author dragon
 * @version 1.0
 * @date 2024/9/30 14:12
 */
public enum DesensitizedType {

    /**
     * 【用户id】不对外提供userId
     */
    USER_ID(s -> String.valueOf(0)),

    /**
     * 【中文姓名】只显示第一个汉字，其他隐藏为2个星号，比如：李**
     */
    CHINESE_NAME(DesensitizedUtils::chineseName),

    /**
     * 姓名，第2位星号替换
     */
    USER_NAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),

    /**
     * 身份证，中间10位星号替换
     */
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")),

    /**
     * 固定电话 前四位，后两位
     */
    FIXED_PHONE(DesensitizedUtils::fixedPhone),

    /**
     * 手机号，中间4位星号替换
     */
    MOBILE_PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),

    /**
     * 【地址】只显示到地区，不显示详细地址，比如：北京市海淀区****
     */
    ADDRESS(s -> DesensitizedUtils.address(s, 8)),

    /**
     * 电子邮箱，仅显示第一个字母和@后面的地址显示，其他星号替换
     */
    EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")),

    /**
     * 【密码】密码的全部字符都用*代替，比如：******
     */
    PASSWORD(DesensitizedUtils::password),

    /**
     * 车牌号码，包含普通车辆、新能源车辆
     */
    CAR_LICENSE(DesensitizedUtils::carLicense),

    /**
     * 银行卡号，保留最后4位，其他星号替换
     */
    BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1")),

    /**
     * IPv4脱敏，如：脱敏前：192.0.2.1；脱敏后：192.*.*.*。
     */
    IPV4(DesensitizedUtils::ipv4),

    /**
     * IPv6脱敏，如：脱敏前：2001:0db8:86a3:08d3:1319:8a2e:0370:7344；脱敏后：2001:*:*:*:*:*:*:*
     */
    IPV6(DesensitizedUtils::ipv6),

    /**
     * 定义了一个first_mask的规则，只显示第一个字符
     */
    FIRST_MASK(DesensitizedUtils::firstMask),
    ;

    private final Function<String, String> desensitized;

    DesensitizedType(Function<String, String> desensitized) {
        this.desensitized = desensitized;
    }

    public Function<String, String> desensitized() {
        return desensitized;
    }

}
